package edu.cuit.avatar.collection;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

/**
 * 数组线性表类ArrayList和链表类LinkedList是实现List接口的两个具体类。ArrayList用数组存储元素，这个数组是动态创建的。如果元素个数超过了数组的容量，就创建一个更大的新数组，并将当前数组中的所有元素都复制到新数组中。LinkedList在一个链表中存储元素。要选用这两类中的哪一个依赖于特定需求。如果需要通过索引随机访问元素，而不会在线性表起始位置插入和删除元素，那么ArrayList提供了最高效率的集合。但是，如果应用需要在线性表的起始位置插入或者删除元素，就应该选择LinkedList类。线性表的大小是可以动态增大或减小的。然而数组一旦被创建，它的大小就是固定的。如果应用不需要在线性表中插入或删除元素，那么数组是效率最高的数据结构。
 * @author <a href="mailto:1020zhaodan@163.com">Adan</a>
 * @version 1.0
 * @date 2025/7/14 15:10
 */
public class ListTest {
    public static void main(String[] args){
        List<Integer> list1 = new ArrayList<>(1000000);
        /*
         * 如果向ArrayList中循环添加100w条数据,会发生什么
         */
        for(var i = 0; i < 1000000; i++){
            list1.add(i);
        }

        List<Integer> list2 = new LinkedList<>(list1);
        //list2.addAll(list1);

        //基于索引加载元素
        var begin = System.currentTimeMillis();
        for(var i = 0; i < list1.size(); i++)
            list1.get(i);
        var end = System.currentTimeMillis();
        System.out.printf("数组线性表get-i所花费的时间 %d ms\r\n", end - begin);

        begin = System.currentTimeMillis();
        var iterator = list1.iterator();
        while(iterator.hasNext())
            iterator.next();
        end = System.currentTimeMillis();
        System.out.printf("数组线性表iterator所花费的时间 %d ms\r\n", end - begin);

        begin = System.currentTimeMillis();
        for(var e : list1);
        end = System.currentTimeMillis();
        System.out.printf("数组线性表for-each所花费的时间 %d ms\r\n", end - begin);

        begin = System.currentTimeMillis();
        for(var e : list2);
        end = System.currentTimeMillis();
        System.out.printf("链表线性表for-each所花费的时间 %d ms\r\n", end - begin);

        begin = System.currentTimeMillis();
        iterator = list2.iterator();
        while(iterator.hasNext())
            iterator.next();
        end = System.currentTimeMillis();
        System.out.printf("链表线性表iterator所花费的时间 %d ms\r\n", end - begin);



//        begin = System.currentTimeMillis();
//        for(var i = 0; i < list2.size(); i++)
//            list2.get(i);
//        end = System.currentTimeMillis();
//        System.out.printf("链表线性表get-i元素所花费的时间 %d ms\r\n", end - begin);

        //数组线性表在头部增删元素
        begin = System.currentTimeMillis();
        list1.add(0, -100);
        //System.out.println(list1.get(0));
        end = System.currentTimeMillis();
        System.out.println("ArrayList:" + (end - begin));

        //数组线性表在头部增删元素
        begin = System.currentTimeMillis();
        list2.add(0, -100);
        //System.out.println(list1.get(0));
        end = System.currentTimeMillis();
        System.out.println("LinkedList:" + (end - begin));

        /*
         *  Vector内部也是才数组实现的线性表
         *  和ArrayList的区别：
         *      Vector是线程安全(同步)的;ArrayList非线程安全
         */
        Vector<String> vector = new Vector<>();
        vector.add("Peppa");
    }
}
